"""
自定义文件存储后端，使得我们的image.url得出的结果前面拼接完整的fdfs请求url前缀
"""

# Storage：存储后端基类
from django.conf import settings
from django.core.files.storage import Storage

from rest_framework.serializers import ValidationError
from fdfs_client.client import Fdfs_client

from s1024.settings import FDFS_CLIENT_CONF


class FastDFSStorage(Storage):

    def open(self, name, mode='rb'):
        # 如果需要把上传的文件存储django本地，则需要在本地打开一个文件
        return None  # 把图片上传fdfs，不是保存本地

    def save(self, name, content, max_length=None):
        # 保存文件逻辑：把文件上传到fdfs服务器上
        # name是文件名
        # content是上传的文件被封装成的文件对象

        # 调用fdfs客户端接口实现文件上传到fdfs
        # conn = Fdfs_client('/s1024/utils/fastdfs/client.conf')
        conn = Fdfs_client(FDFS_CLIENT_CONF)
        # 调用接口上传

        res = conn.upload_by_buffer(content.read())
        # res类型是dict
        # {
        #   'Group name': 'group1',
        #   'Uploaded size': '72.00KB',
        #   'Local file name': '1.jpg',
        #   'Status': 'Upload successed.',
        #   'Remote file_id': 'group1/M00/00/02/wKjLoV8OcG-AcxdDAAEh_koVzDo213.jpg',
        #   'Storage IP': '192.168.203.161'
        # }
        if res['Status'] != 'Upload successed.':
            # 说明上传失败！
            raise ValidationError("上传文件失败！")

        # fdfs文件标识，需要存储到mysql
        file_id = res['Remote file_id']

        return file_id  # 文件存储后端save方法返回的结果就是存储到mysql中的数据

    def url(self, name):
        # 该函数决定了，ImageField.url的结果
        # name: 当前字段在数据库中存储的值
        # name = group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429
        # "http://image.meiduo.site:8888/" + name
        return settings.FDFS_URL + name

    def exists(self, name):
        # 用于判断文件是否重复保存
        # return True # 文件已经存在
        # 当前业务返回False，表示"文件不保存本地，直接调用后续的save方法实现上传fdfs"
        return False  # 文件不存在